I've tried the intersect function but that also returns small zipcodes entirely within a city. Ideally, I just need zipcodes that extend beyond city lines.
The tool you are looking for is select by location under: Vector => Research Tools => Select by Location with settings as in the image below.
The zipcode layers goes in the first dropdown and the city layer in the second dropdown. Check include features that overlap/cross the selection features. And you should get only intersecting features as below: