劍指Offer系列(16) 合併兩個排序的鍊錶

2021-09-01 00:04:28 字數 1893 閱讀 7592

題目:輸入兩個遞增排序的鍊錶,合併這兩個鍊錶並使新鍊錶中的節點仍然是按照遞增排序的。例如輸入 鍊錶1 :1->3->5->7

鍊錶2:2->4->6->8,則結果為1->2->3->4->5->6->7->8

這裡我介紹兩種寫法,其實兩種寫法思路是一樣的,只不過第二中解法將迴圈寫成了遞迴,這樣看起來漂亮的多,不過還是建議要把第一種弄懂這樣會對我們的理解好的多。

首先,對於兩個鍊錶,我們需要進行引數檢查

之後,寫兩個指標分別指向各自的第乙個元素,新建乙個鍊錶,將兩個指標對應的節點中較小的數加到新鍊錶上,同時較小的數所在鍊錶指標往後移一位,一直這樣迴圈到某一鍊錶遍歷完畢為止。

現在我們完成了第一步,接下來需要判斷,是否有某個鍊錶還沒有遍歷完?(示例中的鍊錶是等長的,但不是所有鍊錶都是等長的)因為鍊錶本身是有序的,因此我們直接將它續上去即可。

第一種解法**如下:

private static node combine(node list , node otherlist)

if (otherlist == null)

//end:始終指向新鍊錶的最後乙個節點

node end = new node();

//mininp1andp2:指向p1和p2中最小的乙個

node mininp1andp2 = new node();

//最終結果節點

node result = end;

node p1 = list;

node p2 = otherlist;

while(p1 != null && p2 != null)else

end.setnext(mininp1andp2);

p1 = p1.getnext();

p2 = p2.getnext();

//若不加這個if判斷會在最後出現乙個new node()

if (p1 != null || p2 != null)

} //若p2為null(p2已經結束,但p1還沒有)

while(p1 != null)

p1 = p1.getnext();

} //若p1為null(p1已經結束,但p2還沒有)

while(p2 != null)

p2 = p2.getnext();

} return result;

}

第二中思路其實和第一種完全一樣,唯一不同的就是改變了寫法,用遞迴代替while迴圈,這樣看上去會好的多。(第二中裡面開始的入口引數檢查其實本身就包含了第一中方法中兩個鍊錶不一樣長的解決方法)

private static node combine2(node list , node otherlist)

if (otherlist == null)

node result = new node();

if (list.getnumber() < otherlist.getnumber()) else

return result;

}

這裡的node是乙個封裝好的類:

class node

public node()

private int number;

private node next;

public int getnumber()

public void setnumber(int number)

public node getnext()

public void setnext(node next)

@override

public string tostring()

}

劍指offer 合併兩個鍊錶

輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。新建乙個節點作為head,依次遍歷兩個陣列 時間複雜度 o n 空間複雜度 o 1 coding utf 8 class listnode def init self,x self.val x self.ne...

劍指offer 16 合併兩個排序的鍊錶

題目 輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。思路 先對兩個鍊錶用容器進行 然後在容器中對容器內的元素進行排序,最後進行合成鍊錶。struct listnode class solution while phead2 null sort vec.b...

劍指offer 16 合併兩個排序的鍊錶

輸入兩個單調遞增的鍊錶,輸出兩個鍊錶合成後的鍊錶,當然我們需要合成後的鍊錶滿足單調不減規則。時間限制 1秒 空間限制 32768k 熱度指數 366049 本題知識點 鍊錶 新建乙個鍊錶,然後兩個煉表頭元素比較,取較小值加入到鍊錶中 做這道題做了很久,雖然很簡單,但總報錯說死迴圈,後來發現原來是指標...