链表结点的定义
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
1.反转一个单链表
解法1
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode result=null;
while(head!=null){
if(head.val!=val){
addAtTail(result,val);
}else{
head=head.next;
}
}
result=head;
return result;
}
public void addAtTail(ListNode head,int val){
ListNode node=ListNode(val);
node.next=null;
if(head==null){
head=node;
}
while(head.next!=null){
head=head.next;
}
head.next=node;
}
}
解法2
public ListNode reverseList(ListNode head) {
if(head==null){
return null;
}
ListNode prev=null;
ListNode cur=head;
ListNode next=head.next;
while(cur!=null){
cur.next=prev;
prev=cur;
cur=next;
if(next!=null){
next=next.next;
}
}
return prev;
}
解法三:
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head==null||head.next==null){
return head;
}
ListNode prev=head;
ListNode cur=head.next;
ListNode next=null;
while(cur!=null){
next=cur.next;
cur.next=prev;
prev=cur;
cur=next;
}
head.next=null;
head=prev;
return head;
}
}
合并两个有序链表
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
//此处应考虑一条链表为空
if(l1==null){
return l2;
}
if(l2==null){
return l1;
}
ListNode cur1=l1;
ListNode cur2=l2;
ListNode result=null;
ListNode last=null;
while(cur1!=null&&cur2!=null){
if(cur1.val<=cur2.val){
ListNode next=cur1.next;
//将cur1尾插
if(result==null){
result=cur1;
}else{
last.next=cur1;
}
last=cur1;
cur1=next;
}else{
//将cur2尾插
ListNode next=cur2.next;
if(result==null){
result=cur2;
}else{
last.next=cur2;
}
last=cur2;
cur2=next;
}
}
//若遍历结束有一条链表仍不为空直接将其连接到结果链表之后
if(cur1!=null){
last.next=cur1;
}else if(cur2!=null){
last.next=cur2;
}
return result;
}
}