实现思路

在这里我使用的是开辟一个新链表,然后通过比较给定两个链表的值来插入到这个新链表中,最后返回新的链表、


代码实现

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
    	ListNode *res = new ListNode(-1);
    	ListNode *cur = res;
        while(pHead1&&pHead2)
        {
        	if(pHead1->val<=pHead2->val)
        	{
        		cur->next = pHead1;
        		pHead1 = pHead1->next;
        	}
        	else
        	{
        		cur->next = pHead2;
        		pHead2 = pHead2->next;
        	}
            cur = cur->next;
        }
        cur->next = pHead1?pHead1:pHead2;
        return res->next;
    }
};

小技巧:虚拟头结点
为了实现所有节点的统一,给第一个节点前也加了个前驱结点。这样在处理头结点的时候可以像处理其他节点一样。

    	ListNode *res = new ListNode(-1); //这个参数参考上述结点的结构体。
    	ListNode *cur = res;

上述两行代码就是创建了一个虚拟头结点(也可以说创建了一个新的链表),然后通过用cur间接操作 res不会丢失原指向 然后合并完返回了。


图解

我刚开始有一点疑问就是:为什么这个res指针能和其他两个链表连接起来?我之所以有这个疑问是因为我的思路混了,我一直想的是定义一个指针,保存链表开始的位置用于返回。其实这是第二种解题思路,就是把一个链表不断地插入到另一个链表中,这个过程需要保存链表头的位置。 alt