思路如下图所示:
代码:
一目了然
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution
{
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2)
{
if (!l1 && l2) { return l2; }
else if (l1 && !l2 || !l1 && !l2) { return l1; }
ListNode* List1_node;
ListNode* List2_node;
int flag;
if (l1->val <= l2->val)
{
flag = 0;
List1_node = l1;
List2_node = l2;
}
else
{
flag = 1;
List1_node = l2;
List2_node = l1;
}
while (List1_node && List2_node)
{
while (List1_node->next && List1_node->val <= List2_node->val && List1_node->next->val <= List2_node->val) { List1_node = List1_node->next; }
ListNode* List1_next = List1_node->next;
List1_node->next = List2_node;
List2_node = List1_next;
}
if (!flag) { return l1; }
return l2;
}
};
运行的有些慢,大佬们勿喷,毕竟是我这个菜鸡自己想出来的思路,这个方法是摁住其中一个链表修改,遍历第一个数字小的那个链表,只有当被修改的链表当前下一个数字比list2_node的头数字大的时候才停止遍历,这个flag就是一个标志位,标记修改哪个链表,并用于在最后进行返回修改好的链表。