輸入一個鏈表,輸出該鏈表中倒數第k個節點。為了符合大多數人的習慣,本題從1開始計數,即鏈表的尾節點是倒數第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;//然后將當前節點指向precur.next = pre;//pre和cur節點都前進一位pre = cur;cur = tmp;}return pre;}
}
輸入兩個遞增排序的鏈表,合并這兩個鏈表并使新鏈表中的節點仍然是遞增排序的。
示例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;}
}
?