[蓝蓝计算机考研算法]-day15合并两个有序链表

77 阅读1分钟

题目描述

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点 组成的。

示例

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4] 

输入:l1 = [], l2 = []
输出:[] 

输入:l1 = [], l2 = [0]
输出:[0] 

思路

  1. 创造一个新链表p。(记得保存头结点,用q表示)

  2. while循环遍历l1和l2,谁小将谁存到p链表中,同时一起向后移。循环条件是l1和l2都存在。

  3. 当退出循环后,判断l1和l2是否有剩余,只可能最多有一个剩余,因为如果两个都有则会继续在循环。

  4. 若l1有剩余,将p指向l1,表示将l1拼接到p链尾。l2同理。

  5. 最后输出q。

具体实现

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
        ListNode* p = new ListNode(0);
	ListNode* q = p; //q来保存p结点,便于返回结果
	while(pHead1!=NULL && pHead2!=NULL){
            if(pHead1->val < pHead2->val){
		p->next=pHead1;
		p=p->next;
		pHead1=pHead1->next;
            }else{
		p->next=pHead2;
		p=p->next;
		pHead2=pHead2->next;
            }
	}
	if(pHead1){
            p->next=pHead1;
	}
	if(pHead2){
            p->next=pHead2;
	}
            return q->next;
    }
};

小结

定义一个新链表来保存最后的结果,并输出这个链表。(该代码是在牛客上编译的)