地址:
问题描述:
C++代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode *dummy=new ListNode(-1),*tail=dummy;
while(l1&&l2){
if(l1->val<=l2->val){
tail=tail->next=l1;
l1=l1->next;
}
else {
tail=tail->next=l2;
l2=l2->next;
}
}
if(l1) tail->next=l1;
else tail->next=l2;
return dummy->next;
}
};
自己想的很笨的方法:
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode p=l1; ListNode q=l2;
List<Integer> list=new ArrayList<>();
while(p!=null){
list.add(p.val);
p=p.next;
}
while(q!=null){
list.add(q.val);
q=q.next;
}
//进行升序排序
Collections.sort(list);
//尾插法
ListNode head=new ListNode();
ListNode tail=new ListNode();
head.next=null;
tail=head;
for(int i=0;i<list.size();i++){
ListNode l=new ListNode(0);
l.val=list.get(i);
tail.next=l;
tail=l;
}
tail.next=null;
return head.next;
}
}
本问题两个需要合并的链表本来就是升序的,所以有更加简单的解法:
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
//p,q分别是l1和l2的移动指针
ListNode p=l1;ListNode q=l2;
//本条链表用来存储最后结果
ListNode head=new ListNode();
head.next=null;
//h是结果链表的移动指针
ListNode h=head;
//开始进行比较
while(p!=null&&q!=null) {
if (p.val <= q.val) {
ListNode temp = new ListNode(p.val);
h.next=temp;
p=p.next;
}
else{
ListNode temp = new ListNode(q.val);
h.next=temp;
q=q.next;
}
h=h.next;
}
//假如此时还有链表非空,将结果链表末尾接上非空链表就行
if(p!=null){
h.next=p;
}
if(q!=null){
h.next=q;
}
return head.next;
}
}