You can make an overlay (intersects/touches) of your river lines with a polygon representing the sea.
Before you can do this, you need a polygon layer representing the sea. Best use data for the sea that is created by the same institution that you have your rivers from so that you can be sure that datasets match. This is important not to have topological errors like rivers that do not reach the sea because they are a too short and do not touch the coastline (even if just for a fraction of a millimeter).
One such case is the river Le Var that reaches the Mediterranean between the airport of Nice and Saint-Laurent-du-Var. But as you can see on the next screenshot, combining your river dataset with OpenStreetMap polygons for the Mediterranean, there is a small gap of ca. 30 meters (see red rectangle) between the end point of the river (dark blue line) and the coastline (black line):
As an alternative, when you use use any other polygons for the sea, than apply a small buffer to the sea polygons. I tried that with a part of the Mediterranean that borders France using the sea polygons I got from OpenStreetMap. The buffer size should be big enough to avoid the problem mentioned before and small enough not to reach riverlines in the inland that in fact do not touch the coastline. A value of 100 Meters could be a good start. In any case, check your data at random sample points to see how good it fits.
Do not forget to create a spatial index for both layers: rivers and sea/buffered sea. So create a spatial index, right click on the layer,
Properties / Source tab and click
Create spatial index. That helps to accelerate the processing time. Be sure that you unzip all data before loading to QGIS.
When you have your data ready (river line layer, sea polygon layer), it's time for the actual processing:
Menu Vector / Data Management Tools / Join attributes by location, set the rivers as Base Layer and the Sea polygons as Join layer. Check the boxes
touches, than run the tool: it will output a copy layer of your rivers, but with new attributes. One is the id attribute (preceded with the prefix, if you defined one in the tool): it contains the identifier of the polygon layer it touches or intersects. Thus if you have a number there, you know that this river segment reaches the sea.
You can now use this output to style rivers that flow to the sea differntly than the others that do not reach the sea. In the screenshot below, I added a new symbol layer (green plus symbol), set it to
Geometry generator / LineString and pasted this expression:
imp_fid is the field created by the tool that contains the feature id of the sea polygon that the line touches or intersect: if it is empty, the river does not have access to the see, if it is not empty, thus
>0, QGIS should draw the river (
$geometry), otherwise the output should be empty:
It set this symbol layer to a thicker, dark blue line. The other symbol layer has a standard, thin black line: so you see that the blue lines are those rivers that reach the sea:
However, in your data you still have some strange cases that are difficult to assess in an automatical process. An example are the two small lines a few km north west of La Ciotat, nearby coordinates 5.564645,43.193170 (EPSG:4326). You should critically reflect what the data you have represents and what should be considered "a river" - you might want to apply a minimal length criteria for a line to be considered being "a river".