入力されたリンクリスト、リンクリストの出力最後から二番目のノードk。ほとんどの人々の習慣を満たすために、この質問は、ノードのリストの最後にある最後から二番目のノードであること、1からカウント。例えば、リンクされたリストは、6つのノードを有し、ノードがゼロからスタート、その値が順次1,2,3,4,5,6です。ノードのリストは、第3のノード4の逆数です。
例:
リストが与えられる:1-> 2-> 3-> 4-> 5、及びk = 2。
結果のリストの4-> 5。
アイデア:素早く頭へのポインタをポインタをスピードアップするために一緒に来て、その後、高速のポインタkのステップを行って、その後、ゆっくりとポインタが答えです。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
ListNode former = head, latter = head;
for(int i = 0; i < k; i++)
former = former.next;
while(former != null) {
former = former.next;
latter = latter.next;
}
return latter;
}
}
関数の定義、リストの先頭の入力ノード、およびリストの後にヘッドノードリストの出力反転を反転します。
例:
入力:1-> 2-> 3-> 4- > 5-> NULL
出力:5-> 4-> 3-> 2- > 1-> NULL
制限事項:
0 <=ノードの数<= 5000
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
//前一个节点
ListNode pre = null;
//当前处理节点
ListNode cur = head;
//记录后一个节点用
ListNode tmp = null;
while(cur!=null) {
//记录当前节点的下一个节点
tmp = cur.next;
//然后将当前节点指向pre
cur.next = pre;
//pre和cur节点都前进一位
pre = cur;
cur = tmp;
}
return pre;
}
}
リストの2つの昇順を入力し、二つのリストをマージして、新しいノードのリストがまだの昇順です。
例1:
入力:1-> 2-> 4、1-> 3-> 4
出力:1-> 1-> 2-> 3-> 4-> 4つ
の制限:
0 <=鎖長<= 1000
アイデア:マージリスト。同様のアイデアや配列。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode ans=new ListNode(-1);
ListNode temp=ans;
while(l1!=null && l2!=null){
if(l1.val>l2.val){
ans.next=l2;
l2=l2.next;
}else{
ans.next=l1;
l1=l1.next;
}
ans=ans.next;
}
if(l1!=null)ans.next=l1;
if(l2!=null)ans.next=l2;
return temp.next;
}
}