鏈表的實際運用————leetcode第21題詳解

不廢話,題如下(來自leetcode第21題):
將兩個升序鏈表合併爲一個新的升序鏈表並返回。新鏈表是通過拼接給定的兩個鏈表的所有節點組成的。

示例:
輸入:1->2->4 , 1->3->4
輸出:1->1->2->3->4->4

解:
這道題題幹非常簡單,就是把兩個鏈表合併,什麼?你說你不知道啥叫鏈表?請點擊這個神祕鏈接點這裏,這裏能教給你C語言啊,指針啊,鏈表啊等等這些基礎們,廢話少說,回到題目,這個題目其實跟一道數組題有點像啊,只不過這裏是鏈表,我們很容易就想到了使用歸併排序裏的那種方法就可以解決這個問題,歸併排序請見點這裏看神祕內容,歸併排序就是這樣的,兩個有序數組合併成一個有序數組,所以不要太簡單好麼,請看代碼:

struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) {
	struct ListNode* p = l1;
	struct ListNode* q = l2;
	struct ListNode* result = (struct ListNode*)malloc(sizeof(struct ListNode));
	struct ListNode* k = result;
	k->next = NULL;
	k->val = 0;
	while (p != NULL && q != NULL)
	{
		struct ListNode* pNew = (struct ListNode*)malloc(sizeof(struct ListNode));
		if (p->val <= q->val)
		{
			pNew->val = p->val;
			k->next = pNew;
			k = pNew;
			pNew->next = NULL;
			p = p->next;
		}
		else
		{
			pNew->val = q->val;
			k->next = pNew;
			k = pNew;
			pNew->next = NULL;
			q = q->next;
		}
	}
	while (p != NULL)
	{
		struct ListNode* pNew = (struct ListNode*)malloc(sizeof(struct ListNode));
		pNew->val = p->val;
		k->next = pNew;
		pNew->next = NULL;
		k = pNew;
		p = p->next;
	}
	while (q != NULL)
	{
		struct ListNode* pNew = (struct ListNode*)malloc(sizeof(struct ListNode));
		pNew->val = q->val;
		k->next = pNew;
		pNew->next = NULL;
		k = pNew;
		q = q->next;
	}
	return result->next;
}

上面的代碼其實還蠻簡單的,基本上大家都能看懂,什麼?你說你看不懂?那你來打我啊,這裏我想指出的一共有三個點:
(1)k指針的下一個節點指向空的問題,也就是下面這兩句:
k->next = NULL;
k->val = 0;
這個主要是防止出現傳入參數爲空的鏈表這種情況,假如沒有這兩句,傳入一個空鏈表,導致的後果就是會報錯。因爲next節點指向了一個“黑區域”,沒有分配地址,next指針裏是一個垃圾數字。
(2)pNew下一個節點指向空的問題,也就是下面這句:
pNew->next = NULL;
這個主要是爲了最後一次不會出現多執行一次,因爲垃圾數字的原因,不爲NULL會多執行一次,導致報錯
(3)還有返回值的問題,返回值應該是result->next,這是因爲k->next = pNew;這一句,我們第一個節點實際上是result的第二個節點,所以返回的鏈表從result->next開始。
That’s All.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章