Leetcode21-合并两个有序链表
题目描述
我的思路
1.先把链表l1的值给一个初始化链表head
2.再把链表l2的值给head
3.再获取总的链表head的长度
4.再把这个链表赋值给数组
5.然后数组排序后给链表,最后输出排序后的链表
ps:还是绕不开数组,对链接的使用还是不够精准。
实现代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode head = null, tail = null;
while(l1!=null){
if(head == null){
head = tail = new ListNode(l1.val);
}
else{
tail.next = new ListNode(l1.val);
tail = tail.next;
}
l1=l1.next;
}
while(l2!=null){
if(head == null){
head = tail = new ListNode(l2.val);
}
else{
tail.next = new ListNode(l2.val);
tail = tail.next;
}
l2=l2.next;
}
//对链表排序
int[] arry = new int[110];
int ii=0;
while(head!=null){
arry[ii]=head.val;
head = head.next;
ii++;
}
for(int i =0;i<ii;i++){
for(int j=i+1;j<ii;j++){
if(arry[i]>arry[j]){
int temp = arry[i];
arry[i]=arry[j];
arry[j]=temp;
}
}
}
ListNode l = new ListNode(arry[0]);
ListNode nextnode;
nextnode = l;
for(int i =1;i<ii;i++){
nextnode.next = new ListNode(arry[i]);
nextnode=nextnode.next;
}
if(ii == 0){
l=head;
}
return l;
}
}
官方题解
ps:我写的不叫代码,叫垃圾。官方的果然是值得借鉴!
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode prehead = new ListNode(-1);
ListNode prev = prehead;
while(l1!=null&&l2!=null){
if(l1.val<=l2.val){
prev.next = l1;
l1=l1.next;
}
else{
prev.next = l2;
l2=l2.next;
}
prev = prev.next;
}
// 合并后 l1 和 l2 最多只有一个还未被合并完,我们直接将链表末尾指向未合并完的链表即可
prev.next = l1 == null?l2:l1;
return prehead.next;
}
}
总结
1.链表的使用和排序(在困难模式会借鉴这里的官方思路)
2.prev.next = l1 == null?l2:l1;(以后也要经常用这种简洁有力的代码)